import requests
from bs4 import BeautifulSoup
import json
from tqdm import tqdm
import time

class BaseScraper:
    """基础爬虫类，用于从URL获取HTML内容"""
    def __init__(self, headers=None, delay=2):
        """
        初始化爬虫
        :param headers: 请求头
        :param delay: 请求间隔时间（秒）
        """
        self.headers = headers or {
            'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/138.0.0.0 Safari/537.'
        }
        self.delay = delay
    
    def get_html_content(self, url, timesleep=None):
        """
        获取HTML内容
        :param url: 要请求的URL
        :param timesleep: 请求间隔时间（秒）
        :return: HTML内容
        """
        if timesleep:
            time.sleep(timesleep)
        response = requests.get(url, headers=self.headers)
        response.encoding = 'utf-8'
        self.html_content =  response.text

class ContentScraper(BaseScraper):
    """内容爬虫类，用于从章节页面抓取章节内容"""

    def __init__(self, headers=None, delay=2):
        """
        初始化爬虫
        :param headers: 请求头
        :param delay: 请求间隔时间（秒）
        """
        super().__init__(headers, delay)

    def parse_chapter_content(self):
        """
        解析章节内容
        :param html_content: HTML内容
        :return: 章节内容
        """
        soup = BeautifulSoup(self.html_content, 'html.parser')
        self.content = soup.find('div', id='chaptercontent').text
        return self.content

class ChapterListScraper:
    """章节列表爬虫类，用于从目录页面抓取章节列表"""

    def __init__(self, headers=None, delay=2):
        """
        初始化爬虫
        :param headers: 请求头
        :param delay: 请求间隔时间（秒）
        """
        super().__init__(headers, delay)
    
    def parse_chapter_list(self):
        """
        解析章节列表
        :param html_content: HTML内容
        :return: 章节列表
        """
        soup = BeautifulSoup(self.html_content, 'html.parser')
        chap_dict = {}
        chapter_dl = soup.find_all('dl')[1]
        for tag in chapter_dl.find_all('dd'):
            if tag.a and tag.a.string != '<<---展开全部章节--->>':
                chap_name = tag.a.string
                # 构造绝对URL
                href = 'https://www.c2186a.sbs/' + tag.a['href']
                chap_dict[chap_name] = href
        return 
    
class NovelListScraper:
    """小说列表爬虫类，用于从小说主页抓取小说元数据"""

    def __init__(self, headers=None, delay=2):
        """
        初始化爬虫
        :param headers: 请求头
        :param delay: 请求间隔时间（秒）
        """
        super().__init__(headers, delay)
    
    def parse_novels(self, html_content):
        """
        解析小说列表
        :param html_content: HTML内容
        :return: 小说列表
        """
        # 解析网站地图获取所有的小说链接